#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

################################################
##    Interface graphique du compilateur      ##
################################################
package require Tk

#Inclusion du fichier de procédures
source ./procedures.tcl
source ./procedures_compilation.tcl
source ./procedures_PCode.tcl

#Texte lu et envoyé par le programme C
global texteLu
#pipe
global pipe_my_loop

global play_etat_timer

set play_etat_timer 0
set play_continue 0

#Liste contenant les numéros de lignes avec points d'arrets
listbox .lstPointsArret

#nom du programme Pascal à manipuler
set filename ""

#Nombre de lignes du programme pascal
set nbLignesPascal 1
set nbLignesPCode 1

#Position curseur console
set positionCurseurConsole 1

#redimension de la fenetre d'origine
wm geometry . 1400x1024

#changement du titre de la fenêtre
wm title . "Compilateur de fichiers"

#Creation du menu
menu .menu

#Ajout des noms de menu
menu .menu.file -tearoff 0
menu .menu.tool -tearoff 0

#Ajout du menu Fichier
.menu add cascade -label "Fichier" -menu .menu.file

#Ajout des différents sous-menu de l'onglet "Fichier"
.menu.file add command -label "Nouveau" -command { nouveau_fichier }
.menu.file add command -label "Ouvrir" -command { ouvrir_fichier }
.menu.file add command -label "Enregistrer" -command { enregistrer_fichier }
.menu.file add command -label "Enregistrer Sous" -command { enregistrer_sous }
.menu.file add command -label "Quitter" -command { fermer_interface }

#Raccourcis clavier
bind . <Control-n> {nouveau_fichier}
bind . <Control-s> {enregistrer_fichier}
bind . <Control-t> {enregistrer_sous}
bind . <Control-o> {ouvrir_fichier}
bind . <Control-q> {fermer_interface}

#Configuration du menu
. configure -menu .menu

#Frame des opérations de compilation
frame .frame_compilation
pack .frame_compilation -side top 

#Frame contenant le compilateur et le dérouleur d'étapes
frame .frame_compilateur
frame .frame_PCode

#Frame de gauche et de droite de la frame de compilation
frame .frame_compilation_gauche
frame .frame_compilation_droite

#Conception des widgets des frames d'explorations
#Label indiquant le chemin courant dans le client
label .lbl_titre_compilation -text "Code Pascal"

#Liste de compilation gauche
text .txt_compilation  -height 33 -width 55 -wrap none -bg "white"

#configuration de la barre d'exploration verticale du compilateur
.txt_compilation configure -yscrollcommand {.sb_y_compilation set} -xscrollcommand {.sb_x_compilation set} -yscrollcommand sync_com
scrollbar .sb_y_compilation -orient vertical -command ".txt_compilation yview"
scrollbar .sb_x_compilation -orient horizontal -command ".txt_compilation xview"

proc sync_com {args} {
   eval [linsert $args 0 .sb_y_compilation set]
   yview moveto [lindex [.sb_y_compilation get] 0]
}

proc sync_pco {args} {
   eval [linsert $args 0 .sb_y_PCode set]
   yview moveto [lindex [.sb_y_PCode get] 0]
}

proc yview {args} {
	if {$args == "moveto [lindex [.sb_y_compilation get] 0]"} {
		eval [linsert $args 0 .txt_compilation yview]
		eval [linsert $args 0 .lst_lignes_Pascal yview]
	}
	if {$args == "moveto [lindex [.sb_y_PCode get] 0]"} {
		eval [linsert $args 0 .txt_pCode yview]
   	eval [linsert $args 0 .lst_lignes_PCode yview]
	}	
}

#taille de police
set fontListe [font create fontListe -size 8]

#Numéros de lignes de la fenêtre du programme Pascal
listbox .lst_lignes_Pascal -font fontListe -width 3 -bg gray

#pack de la fenêtre de compilation
pack .lbl_titre_compilation .frame_compilateur .sb_x_compilation -in .frame_compilation_gauche -side top -fill x
pack .lst_lignes_Pascal .txt_compilation .sb_y_compilation -in .frame_compilateur -side left -expand true -fill y

#label du titre des étapes
label .lbl_titre_PCode -text "PCode"

#Widget text d'affichage de PCode
text .txt_pCode -height 28 -width 55 -wrap none -bg "white"

#configuration de la barre d'exploration verticale des étapes
.txt_pCode configure -yscrollcommand [list .sb_y_PCode set] -xscrollcommand [list .sb_x_PCode set] -yscrollcommand sync_pco
scrollbar .sb_x_PCode -orient horizontal -command ".txt_pCode xview"
scrollbar .sb_y_PCode -orient vertical -command ".txt_pCode yview"

#Frame contenant les boutons de commandes pour le PCode
frame .frame_commandes_pCode -padx 140
#Bouton d'execution de l'instruction
button .frame_commandes_pCode.btn_pCode_exec -text "Exec" -command {Cmd_PCode_Exec}
#Bouton du passage à l'instruction suivante
button .frame_commandes_pCode.btn_pCode_suivant -text "Next" -command {Cmd_PCode_Next}
#Bouton pour play
button .frame_commandes_pCode.btn_pCode_play -text "Play" -command {Cmd_PCode_Play}

#Pack des frames de la zone du bas
grid .frame_commandes_pCode.btn_pCode_exec -row 1 -column 0
grid .frame_commandes_pCode.btn_pCode_suivant -row 3 -column 0
#grid .frame_commandes_pCode.btn_pCode_play -row 3 -column 1

#Numéros de lignes de la fenêtre du programme Pascal
listbox .lst_lignes_PCode -font fontListe -width 3 -bg gray
bind .lst_lignes_PCode <<ListboxSelect>> [list selectionChangedLignesPCode]

#pack de la fenêtre du PCode
pack .lbl_titre_PCode .frame_PCode .sb_x_PCode -in .frame_compilation_droite -side top -fill x
pack  .lst_lignes_PCode .txt_pCode .sb_y_PCode -in .frame_PCode -side left -fill y
pack .frame_commandes_pCode -in .frame_compilation_droite -side top

#Frame centrale des boutons
frame .frame_boutons_compilation

#Boutons lancant la compilation
button .btn_analyser -text "Analyser" -command { analyser_programme }
button .btn_compilation -text "Compiler" -state disabled -command { compiler }

#Frame des boutons de la compilation
pack .btn_analyser .btn_compilation -in .frame_boutons_compilation -side top

#Frame de la pile d'éxécution
frame .frame_pile_execution

#Liste de la pile d'éxécution
listbox .lst_pile_execution -height 19 -width 30 -bg "gray"

#label du titre des étapes
label .lbl_titre_pile -text "Pile d'exécution"

#Frame contenant les boutons de commandes pour la pile d'éxécution
frame .frame_commandes_pile -padx 10
#label du compteur ordinal
label .lbl_compteurOrdinal -text "CO"
#label du drapeau
label .lbl_flag -text "Flag"
#label de la dernière instruction observée
label .lbl_lastInstr -text "RI"

#label du compteur ordinal
text .txt_compteurOrdinal -height 1 -width 20 -state disabled -bg "gray"
#label du drapeau
text .txt_flag -height 1 -width 20 -state disabled -bg "gray"
#label de la dernière instruction observée
text .txt_lastInstr -height 1 -width 20 -state disabled -bg "gray"

#Pack des frames de la zone du bas
frame .frame_co
frame .frame_flag
frame .frame_instr
pack .lbl_compteurOrdinal .txt_compteurOrdinal -in .frame_commandes_pile
pack .lbl_flag .txt_flag -in .frame_commandes_pile
pack .lbl_lastInstr .txt_lastInstr -in .frame_commandes_pile

pack .frame_co .frame_flag .frame_instr -in .frame_commandes_pile -side top

#Pack de la pile d'éxécution et de son label dans sa frame
pack .lbl_titre_pile .lst_pile_execution .frame_commandes_pile -in .frame_pile_execution -side top

#Pack de la partie compilation
pack  .frame_compilation_gauche .frame_boutons_compilation .frame_compilation_droite .frame_pile_execution -in .frame_compilation -side left -padx 5 -pady 20

#Frame situé au base de l'interface
frame .frame_bas

#Frame contenant la console
frame .frame_console -padx 5
text .console -height 20 -width 120 -bg "black" -fg "white" -wrap none 

text .console_saisi -height 0 -width 120 -bg "black" -fg "white" -wrap none
bind .console_saisi <Return> getLineConsole

.console configure -yscrollcommand [list .sb_y_console set] -xscrollcommand [list .sb_x_console set]
scrollbar .sb_x_console -orient horizontal -command ".console xview"
scrollbar .sb_y_console -orient vertical -command ".console yview"

pack .console .console_saisi -in .frame_console -side top

pack .frame_console
pack .frame_bas -side top

